package com.mycompany.dao.memoria;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.mycompany.dao.ControlAccesoDao;
import com.mycompany.model.ControlAcceso;

/**
 * Clase que implementa de forma senciall un dao en memoria de objetos control de acceso
 * @author javachavez@gmail.com
 *
 */
@Repository("controlAccesoDao")
public class ControlAccesoDaoEnMemoria implements ControlAccesoDao{ 

   static Long genId=new Long(1);
   static List<ControlAcceso> acl;
	
   public ControlAccesoDaoEnMemoria(){
	   if (acl == null){
		   acl= new ArrayList<ControlAcceso>();
		   acl.add(new ControlAcceso(genId++,"192.168.0.10","192.168.0.2","TCP","ALLOW"));
		   acl.add(new ControlAcceso(genId++,"88.1.12.225","192.168.0.2","TCP","DENY"));
		   acl.add(new ControlAcceso(genId++,"192.168.0.10","192.168.0.1","UDP","ALLOW"));
		   acl.add(new ControlAcceso(genId++,"*","192.168.0.2","*","DENY"));
	   }
   }
   
	/**
	 * Obtiene lista de Control de accesos
	 * @return lista de control de accesos
	 */
   public List<ControlAcceso> get() {
        return acl;
    }
	
   /** 
	* Obtiene Control de acceso
    * @param id del control de acceso a obtener
    * @return control de accesos
    */
   public ControlAcceso get(Long id) {
	   ControlAcceso encon = null;
	   	for(ControlAcceso ca : acl){
	   		if(ca.getId().equals(id)){
	   			encon=ca;
	   			break;
	   		}
	   	}
	   	return encon;
    }
   
   /**
    * Borra control de acceso dado segun parametro
    * @param id del control de acceso a borra
    * @return boolean si se ha borrado la lista de acceso
    */
    public boolean  remove(Long id) {
    	boolean borrado = false;
    	for(ControlAcceso ca : acl){
    		if(ca.getId().equals(id)){
    			acl.remove(ca);
    			borrado=true;
    			break;
    		}
    	}
    	return borrado;
    }
    
    /**
     * Crea control de acceso dado segun parametro
     * @param ca control de acceso a crear
     * @return ControlAcceso creado.
     */
     public ControlAcceso create(ControlAcceso ca) {
     	ca.setId(genId++);
     	acl.add(ca);
     	return ca;
     }
     
     /**
      * Crea control de acceso dado segun parametro
      * @param ca control de acceso a crear
      * @return ControlAcceso creado.
      */
      public boolean update(ControlAcceso caParam) {
    	boolean update = false;
        for(ControlAcceso ca : acl){
        	if(ca.getId().equals(caParam.getId())){
        		acl.remove(ca);
        		acl.add(caParam);
        		update=true;
        		break;
        	}
        }
        
        return update;
      }
}